package ge.usuarios;
import ge.escola.Turma;
import ge.util.Matricula;
import ge.util.Validadores;

/**
 * Classe que modela um aluno. Um aluno tem como atributo principal seu numero
 * de matricula, um numero unico que nao se repete em outro aluno.
 */

public class Aluno {
	private String matriculaDoAluno;
	private String nomeDoAluno;
	private int idadeDoAluno;
	private String enderecoDoAluno;
	private String nomeDoPaiDoAluno;
	private String nomeDaMaeDoAluno;
	private String emailDoAluno;
	private Turma turmaDoAluno;

	/**
	 * Construtor de aluno. Necessita de todos os dados, Nome do pai, da mae e
	 * do aluno, idade, endereco, email do aluno. A matricula do aluno eh gerada
	 * automaticamente e nao pode ser alterada.
	 * 
	 * @param nomeDoAluno
	 *            - Nome que caracteriza o aluno.
	 * @param idadeDoAluno
	 *            - Numero referente a idade do aluno.
	 * @param enderecoDoAluno
	 *            - Endereco de onde o aluno reside.
	 * @param nomeDoPaiDoAluno
	 *            - Nome que caracteriza o pai do aluno.
	 * @param nomeDaMaeDoAluno
	 *            - Nome que caracteriza a mae do aluno.
	 * @param emailDoAluno
	 *            - Endereco de correio eletronico do aluno.
	 * @throws Exception
	 *             - Caso seja passado algum nome, idade ou email invalido.
	 */
	public Aluno(String nomeDoAluno, int idadeDoAluno, String enderecoDoAluno,
			String nomeDoPaiDoAluno, String nomeDaMaeDoAluno,
			String emailDoAluno) throws Exception {

		if (!Validadores.validaNome(nomeDoAluno)) {
			throw new Exception("Nome do aluno invalido !");
		}
		if (!Validadores.validaNome(nomeDaMaeDoAluno)) {
			throw new Exception("Nome da mae do aluno invalido !");
		}
		if (!Validadores.validaNome(nomeDoPaiDoAluno)) {
			throw new Exception("Nome do pai do aluno invalido !");
		}

		if (!Validadores.validaEndereco(enderecoDoAluno)) {
			throw new Exception("Endereco do aluno invalido !");
		}

		if (!Validadores.validaEmail(emailDoAluno)) {
			throw new Exception("Email do aluno invalido !");
		}
		if (idadeDoAluno < 0) {
			throw new Exception("Idade do aluno invalida !");
		}

		this.nomeDoAluno = nomeDoAluno;
		this.idadeDoAluno = idadeDoAluno;
		this.enderecoDoAluno = enderecoDoAluno;
		this.nomeDoPaiDoAluno = nomeDoPaiDoAluno;
		this.nomeDaMaeDoAluno = nomeDaMaeDoAluno;
		this.emailDoAluno = emailDoAluno;
		Matricula matricula = new Matricula();
		this.matriculaDoAluno = matricula.getMatricula();
		this.turmaDoAluno = null;

	}

	/**
	 * Construtor de aluno. Nao necessita de todos os dados, apenas Nome da mae
	 * e do aluno, endereco. A matricula do aluno eh gerada automaticamente e
	 * nao pode ser alterada.
	 * 
	 * @param nomeDoAluno
	 *            - Nome que caracteriza o aluno.
	 * @param idadeDoAluno
	 *            - Numero referente a idade do aluno.
	 * @param enderecoDoAluno
	 *            - Endereco de onde o aluno reside.
	 * @param nomeDoPaiDoAluno
	 *            - Nome que caracteriza o pai do aluno.
	 * @param nomeDaMaeDoAluno
	 *            - Nome que caracteriza a mae do aluno.
	 * @param emailDoAluno
	 *            - Endereco de correio eletronico do aluno.
	 * @throws Exception
	 *             - Caso seja passado algum nome, idade ou email invalido.
	 */
	public Aluno(String nomeDoAluno, String enderecoDoAluno,
			String nomeDaMaeDoAluno) throws Exception {

		if (!Validadores.validaNome(nomeDoAluno)) {
			throw new Exception("Nome do aluno invalido !");
		}
		if (!Validadores.validaNome(nomeDaMaeDoAluno)) {
			throw new Exception("Nome da mae do aluno invalido !");
		}
		
		if (!Validadores.validaEndereco(enderecoDoAluno)) {
			throw new Exception("Endereco do aluno invalido !");
		}
		if (idadeDoAluno < 0) {
			throw new Exception("Idade do aluno invalida !");
		}

		this.nomeDoAluno = nomeDoAluno;
		this.idadeDoAluno = -1;
		this.enderecoDoAluno = "-";
		this.nomeDoPaiDoAluno = "-";
		this.nomeDaMaeDoAluno = nomeDaMaeDoAluno;
		this.emailDoAluno = "-";
		Matricula matricula = new Matricula();
		this.matriculaDoAluno = matricula.getMatricula();
		this.turmaDoAluno = null;
	}

	/**
	 * Tem como funcao matricular o aluno em uma determinada serie e turma.
	 * 
	 * @param nomeDaTurma
	 *            - Turma na qual o aluno serah matriculado.
	 */
	public void matriculaAlunoNaTurma(Turma nomeDaTurma) {
		this.turmaDoAluno = nomeDaTurma;
		System.out.printf("Aluno matriculado com sucesso na turma %s",
				nomeDaTurma.getNome());
	}

	/**
	 * 
	 * @return - Nome do aluno.
	 */
	public String getNomeDoAluno() {
		return nomeDoAluno;
	}

	/**
	 * 
	 * @param nomeDoAluno
	 *            - Nome do aluno.
	 */
	public void setNomeDoAluno(String nomeDoAluno) throws Exception {
		if (!Validadores.validaNome(nomeDoAluno))
			throw new Exception("Nome invalido !");
		this.nomeDoAluno = nomeDoAluno;
	}

	/**
	 * 
	 * @return - Idade do aluno.
	 */
	public int getIdadeDoAluno() {
		return idadeDoAluno;
	}

	/**
	 * 
	 * @param idadeDoAluno
	 *            - Idade do aluno.
	 */
	public void setIdadeDoAluno(int idadeDoAluno) throws Exception {
		if (idadeDoAluno < 0)
			throw new Exception("Idade invalida !");
		this.idadeDoAluno = idadeDoAluno;
	}

	/**
	 * 
	 * @return - Endereco do Aluno.
	 */
	public String getEnderecoDoAluno() {
		return enderecoDoAluno;
	}

	/**
	 * 
	 * @param enderecoDoAluno
	 *            - Endereco do Aluno.
	 */
	public void setEnderecoDoAluno(String enderecoDoAluno) throws Exception {
		if (!Validadores.validaEndereco(enderecoDoAluno))
			throw new Exception("Endereco invalido !");
		this.enderecoDoAluno = enderecoDoAluno;
	}

	/**
	 * 
	 * @return - Nome do pai do aluno.
	 */
	public String getNomeDoPaiDoAluno() {
		return nomeDoPaiDoAluno;
	}

	/**
	 * 
	 * @param nomeDoPaiDoAluno
	 *            - Nome do pai do aluno.
	 */
	public void setNomeDoPaiDoAluno(String nomeDoPaiDoAluno) throws Exception {
		if (!Validadores.validaNome(nomeDoPaiDoAluno))
			throw new Exception("Nome invalido !");
		this.nomeDoPaiDoAluno = nomeDoPaiDoAluno;
	}

	/**
	 * 
	 * @return - Nome da mae do aluno.
	 */
	public String getNomeDaMaeDoAluno() {
		return nomeDaMaeDoAluno;
	}

	/**
	 * 
	 * @param nomeDaMaeDoAluno
	 *            - Nome da mae do aluno.
	 */
	public void setNomeDaMaeDoAluno(String nomeDaMaeDoAluno) throws Exception {
		if (!Validadores.validaNome(nomeDaMaeDoAluno))
			throw new Exception("Nome invalido !");
		this.nomeDaMaeDoAluno = nomeDaMaeDoAluno;
	}

	/**
	 * 
	 * @return - Email do aluno.
	 */
	public String getEmailDoAluno() {
		return emailDoAluno;
	}

	/**
	 * 
	 * @param emailDoAluno
	 *            - Email do aluno.
	 */
	public void setEmailDoAluno(String emailDoAluno) throws Exception {
		if (!Validadores.validaEmail(emailDoAluno))
			throw new Exception("Email invalido !");
		this.emailDoAluno = emailDoAluno;
	}

	/**
	 * 
	 * @return - Matricula do Aluno.
	 */
	public String getMatriculaDoAluno() {
		return matriculaDoAluno;
	}
	
	/**
	 * 
	 * @return - Turma do Aluno.
	 */
	public Turma getTurmaDoAluno() {
		return this.turmaDoAluno;
	}

	/**
	 * Compara se dois alunos sao iguais de acordo com o seu numero de
	 * matriculas.
	 */
	public boolean equals(Object aluno) {

		if (!(aluno instanceof Aluno)) {
			return false;
		}
		Aluno aluno1 = (Aluno) aluno;
		if (aluno1.getMatriculaDoAluno().equals(this.getMatriculaDoAluno())) {
			return true;
		} else
			return false;
	}

	/**
	 * Retorna uma string que representa a classe aluno.
	 */
	public String toString() {
		String stringao = String.format("Matricula: %s\nNome: %s\nTurma: %s\nIdade: %s\nEndereco: %s\nEmail: %s\nMae: %s\nPai:%s",
						                 this.matriculaDoAluno, this.nomeDoAluno
								       , this.turmaDoAluno , this.idadeDoAluno
								       , this.enderecoDoAluno , this.emailDoAluno
								       , this.nomeDaMaeDoAluno , this.nomeDoPaiDoAluno);
		return stringao; 
	}
}
